/**
 * @addtogroup bsc_gnss_module_interface
 * bsc_gnss_module_interface
 * @{
 */
/**
 * @file         bsc_gnss_module_interface.h
 * @brief        定位模块接口
 * @note    
 * @author       Akee(ysk@hopechart.com,尤胜坤)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author                                    <th>Description
 * <tr><td>2020-11-25  <td>1.0                   <td>Akee(ysk@hopechart.com,尤胜坤)            <td>创建初始版本
 * <tr><td>2022-10-28  <td>1.1                   <td>Akee(ysk@hopechart.com,尤胜坤)            <td>gnss_module_interface改为bsc_gnss_module_interface,所有类型加前缀
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BSC_GNSS_MODULE_INTERFACE_H_
#define _BSC_GNSS_MODULE_INTERFACE_H_

#include "ofc/ofc_types.h"
#include "bsc_gnss_server_funcs_interface.h"
#include "nmea/nmea_tokenizer.h"
#include "bsc_gps_common.h"
#ifdef __cplusplus
extern "C" {
#endif


/**
 * Ioctl控制枚举
 * @note 公开此枚举仅为了方便应用进行2次开发扩展新模块用
 */
enum TBsGnssModuleIoctlEnumTag 
{
    kBsGnssDriverIoctlSoftReset = 0,  ///<  软复位
                                    ///< param1: 参考 @ref TBsGpsSoftResetCode
                                    ///< param2: 忽略
    kBsGnssDriverIoctlOutFreq   = 1,  ///<  输出频率
                                    ///< param1: 参考 @ref 
                                    ///< param2: 忽略
    kBsGnssDriverIoctlSentence = 2,   ///<  输出语法配置
                                    ///< param1: 参考 @ref TNmeaSentence
                                    ///< param2: True: 打开; False: 关闭

    kBsGnssDriverIoctlConstellation = 3,  ///< 星座
                                    ///< param1: 参考 @ref TBsGpsConstellation,例如双模为((1 << kBsGpsConstellationGps) | (1 << kBsGpsConstellationBeidou))
                                    ///< param2: 忽略
    kBsGnssDriverIoctlBaudrate = 4,   ///< 波特率
                                    ///< param1: 参考TBsGpsBaudrate
    
    kBsGnssDriverIoctlFactoryReset = 5,   ///< 恢复出厂

    kBsGnssDriverIoctlInitConfig = 6,   ///< 模块初始化配置
};
typedef enum TBsGnssModuleIoctlEnumTag TBsGnssModuleIoctlEnum;

typedef struct IBsGnssModuleTag IBsGnssModule;

/**
 * Ioctl控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param ioc: 控制类型,请参考 @ref TBsGnssModuleIoctlEnum
 * @param param1: 参数1，需要根据具体命令来确认
 * @param param2: 参数2，需要根据具体命令来确认
 * @return >= 0: 成功; <0: 失败
 */
typedef Int32(*IBsGnssModuleDoIoctl)(IBsGnssModule *sender, IBsGnssServerFuncs *server_funcs, TBsGnssModuleIoctlEnum ioc, UInt32 param1, UInt32 param2);

/**
 * 标记处理
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param tokens: 分词器
 * @param addr: 地址字段结构
 * @return >= 0: 成功; <0: 失败
 */
typedef Int32 (*TBsGnssModuleDoToken)(IBsGnssModule *sender, IBsGnssServerFuncs *server_funcs, TNmeaTokenizer *tokens, TNmeaAddrField *addr);

/**
 * 定位模块接口
 */
struct IBsGnssModuleTag
{
    IBsGnssModuleDoIoctl DoIoctl;     ///< 控制指令
    TBsGnssModuleDoToken DoToken;     ///< Token语句
};

/**
 * Ioctl控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param ioc: 控制类型,请参考 @ref TBsGnssModuleIoctlEnum
 * @param param1: 参数1，需要根据具体命令来确认
 * @param param2: 参数2，需要根据具体命令来确认
 * @return >= 0: 成功; <0: 失败
 * @note 应用建议调用TBsGnssModuleIoctlSoftReset等系列接口，不建议直接调用此函数
 */
Int32 TBsGnssModuleIoctl(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, TBsGnssModuleIoctlEnum ioc, UInt32 param1, UInt32 param2);

/**
 * 标记处理
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param tokens: 分词器
 * @param addr: 地址字段结构
 * @return >= 0: 成功; <0: 失败
 */
Int32 TBsGnssModuleToken(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, TNmeaTokenizer *tokens, TNmeaAddrField *addr);

/**
 * 模块软复位控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param value: 软件启动命令码
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlSoftReset(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, TBsGpsSoftResetCode value);

/**
 * 模块输出频率控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param value: 频率值，内部限制要求小于等10,当输入1时，则为1Hz，若为0，则不输出该语句
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlOutFreq(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, UInt8 value);

/**
 * 模块输出语句控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param sentence: 输出的语句
 * @param enable: True: 使能; False: 不使能
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlSentence(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, TNmeaSentence sentence, Bool enable);

/**
 * 星座系统控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param value: 星座系统, 请参考 @ref TBsGpsConstellation
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlConstellation(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, TBsGpsConstellation value);

/**
 * 波特率控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @param value: 波特率, 请参考 @ref TBsGpsSoftResetCode
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlBaudrate(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs, TBsGpsBaudrate value);

/**
 * 模块软件恢复出厂控制函数
 * @param sender: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlFactoryReset(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs);

/**
 * 模块初始化配置
 * @param self: gnss模块指针参数
 * @param server_funcs: gnss服务函数集
 * @return >= 0: 成功; <0: 失败; 注意：成功仅表示消息发送成功
 */
Int32 TBsGnssModuleIoctlInitConfig(IBsGnssModule *self, IBsGnssServerFuncs *server_funcs);

#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
 
 
 
 
 
 
 
 
 
 



